package cn.com.header.core.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 文件公共类
 * 
 * @author fengnuoyang
 *
 */
public class FileUtil {
	private static FileUtil fileUtil;

	/**
	 * 复制整个文件夹内容
	 * 
	 * @param oldPath
	 *            String 原文件路径 如：c:/fqf
	 * @param newPath
	 *            String 复制后路径 如：f:/fqf/ff
	 * @return boolean
	 */
	public static void copyFolder(String oldPath, String newPath) {

		try {
			(new File(newPath)).mkdirs(); // 如果文件夹不存在 则建立新文件夹
			File a = new File(oldPath);
			String[] file = a.list();
			
			File temp = null;
			if(file==null) return;
			for (int i = 0; i < file.length; i++) {
				if (oldPath.endsWith(File.separator)) {
					temp = new File(oldPath + file[i]);
				} else {
					temp = new File(oldPath + File.separator + file[i]);
				}

				if (temp.isFile()) {
					FileInputStream input = new FileInputStream(temp);
					FileOutputStream output = new FileOutputStream(newPath
							+ "/" + (temp.getName()).toString());
					byte[] b = new byte[1024 * 5];
					int len;
					while ((len = input.read(b)) != -1) {
						output.write(b, 0, len);
					}
					output.flush();
					output.close();
					input.close();
				}
				if (temp.isDirectory()) {// 如果是子文件夹
					copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
				}
			}
		} catch (Exception e) {
			System.out.println("复制整个文件夹内容操作出错");
			e.printStackTrace();

		}

	}

	/**
	 * 删除文件
	 * 
	 * @param file
	 */
	public static void deleteFile(File file) {
		if (file.exists()) { // 判断文件是否存在
			if (file.isFile()) { // 判断是否是文件
				file.delete(); // delete()方法 你应该知道 是删除的意思;
			} else if (file.isDirectory()) { // 否则如果它是一个目录
				File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
				for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
					deleteFile(files[i]); // 把每个文件 用这个方法进行迭代
				}
				file.delete();
			}

		} else {
			System.out.println("所删除的文件不存在！" + '\n');
		}
	}
	/**
	 * 转移文件夹(不可以转移到源文件夹的子文件夹内)
	 * @return
	 */	
	public static void moveFolder(String oldPath, String newPath) {
		copyFolder(oldPath,newPath);
		File file=new File(oldPath);
		deleteFile(file);
	}
	public static FileUtil newInstance() {
		if (fileUtil == null) {
			fileUtil = new FileUtil();
		}

		return fileUtil;
	}

	/**
	 * 保存文件
	 * 
	 * @param in
	 * @param file
	 * @throws Exception
	 */
	public void saveFile(InputStream in, File file) throws Exception {

		OutputStream out = new FileOutputStream(file);
		byte[] buffer = new byte[8192];
		int bytesRead = 0;
		while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
			out.write(buffer, 0, bytesRead);
		}
		out.close();
		in.close();

	}

	/**
	 * 获取文件名字
	 * 
	 * @param fileName
	 * @return
	 */
	public Object getFileName(String fileName) {
		try {
			if (fileName.lastIndexOf("/") > 0) {
				return fileName.substring(fileName.lastIndexOf("/") + 1,
						fileName.lastIndexOf("."));
			} else {
				return fileName.substring(0, fileName.lastIndexOf("."));
			}
		} catch (Exception ex) {
			return fileName;
		}
	}

	/**
	 * 鑾峰彇鏂囦欢澶у皬鎻忓彊
	 * 
	 * @param size
	 * @return
	 */
	public String getSizeDescribe(long size) {
		try {
			if (size < 1024) {
				return size + " bytes";
			} else if (size < 1048576) {
				return (Math.round(((size * 10) / 1024)) / 10) + " KB";
			} else {
				return (Math.round(((size * 10) / 1048576)) / 10) + " MB";
			}
		} catch (Exception ex) {
			return Long.toString(size);
		}
	}

	/**
	 * 文件复制
	 * 
	 * @param
	 * @throws Exception
	 */
	public static void copy(File fileFrom, File fileTo) throws Exception {

		FileInputStream in = new FileInputStream(fileFrom);
		FileOutputStream out = new FileOutputStream(fileTo);
		byte[] bt = new byte[1024];
		int count;
		while ((count = in.read(bt)) > 0) {
			out.write(bt, 0, count);
			System.out.println("ha");
		}
		in.close();
		out.close();

	}

	/**
	 * 文件删除
	 * 
	 * @param file
	 * @throws Exception
	 */
	public void delete(File file) throws Exception {

		file.delete();

	}

}
